package com.kelvin.backend.redis.service;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * <p>Title: IRedisService</p>
 * <p>Description: 总结常用的RedisTemplate方法，后续可添加也可以直接用RedisTemplate直接操作</p>
 *
 * @author Kelvin.Chen
 * @datetime 2021/7/9 18:08
 */
public interface IRedisService {

    /**
     * 写入缓存
     *
     * @param key
     * @param value
     * @return
     */
    boolean set(final String key, final Object value);

    /**
     * 存入缓存，并设置有效时间
     *
     * @param key
     * @param value
     * @param expireTime，单位为秒
     * @return
     */
    boolean set(final String key, final Object value, final Long expireTime);

    /**
     * 存入缓存，并设置有效时间
     *
     * @param key
     * @param value
     * @param expireTime
     * @param timeUnit
     * @return
     */
    boolean set(final String key, final Object value, final Long expireTime, TimeUnit timeUnit);

    /**
     * 判断是否存在该key
     * 存在 true
     * 不存在 false
     *
     * @param key
     * @return
     */
    boolean exists(final String key);

    /**
     * 删除指定的key
     *
     * @param key
     */
    boolean remove(final String key);

    /**
     * 删除，可删除多个
     *
     * @param keys
     */
    void remove(final String... keys);

    /**
     * 模糊匹配key，并批量删除模糊查询到的key
     *
     * @param pattern
     */
    void removePattern(final String pattern);

    /**
     * 根据key获取value
     *
     * @param key
     * @return
     */
    Object get(final String key);

    /**
     * 哈希存储
     *
     * @param key
     * @param hashKey
     * @param value
     */
    void hPut(final String key, final Object hashKey, final Object value);

    /**
     * 哈希获取
     *
     * @param key
     * @param hashKey
     * @return
     */
    Object hGet(final String key, final Object hashKey);

    /**
     * 列表开头添加
     *
     * @param key
     * @param value
     */
    void lPush(final String key, final Object value);

    /**
     * 列表结尾添加
     *
     * @param key
     * @param value
     */
    void rPush(final String key, final Object value);

    /**
     * 列表开头删除
     *
     * @param key
     */
    void lPop(final String key);

    /**
     * 列表尾部删除
     *
     * @param key
     */
    void rPop(final String key);

    /**
     * 列表获取
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    List<Object> lRange(final String key, final long start, final long end);

    /**
     * 集合添加
     *
     * @param key
     * @param value
     */
    void sAdd(final String key, final Object value);

    /**
     * 集合获取
     *
     * @param key
     * @return
     */
    Set<Object> setMembers(final String key);

    /**
     * 有序集合添加
     *
     * @param key
     * @param value
     * @param score
     */
    void zAdd(final String key, final Object value, final double score);

    /**
     * 有序集合加分
     *
     * @param key
     * @param value
     * @param score
     */
    void zIncrementScore(final String key, final Object value, final double score);

    /**
     * 获取分数
     *
     * @param key
     * @param value
     */
    Double zScore(final String key, final Object value);

    /**
     * 根据分数区间获取集合
     *
     * @param key
     * @param score1
     * @param score2
     * @return
     */
    Set<Object> rangeScore(final String key, final double score1, final double score2);

    /**
     * 如果键不存在则新增,存在则不改变已经有的值
     * 用于分布式锁
     *
     * @param key
     * @param value
     * @param secod
     * @return
     */
    boolean setIfAbsent(final String key, final Object value, final long secod);
    
}
